﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades;
using System.Text;

namespace EvaluacionWebRole
{
    public partial class Pregunta : System.Web.UI.Page
    {
        PreguntaAleatoria pregunta;

        ServicioPreguntas.PreguntasClient preguntas;
        //LogicaDeNegocios.Preguntas preguntas;

        string codigoExamen;
        string claveExamen;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //preguntas = new LogicaDeNegocios.Preguntas();
                preguntas = new ServicioPreguntas.PreguntasClient();
                
                codigoExamen = GetCookieString("CodigoExamen");
                claveExamen = GetCookieString("ClaveExamen");

                if (!preguntas.VerifiarSiEsUltimaPregunta(claveExamen, codigoExamen))
                {
                    pregunta = ObtenerPregunta(claveExamen, codigoExamen);

                    //bool banderaPreguntaRegistrada = new LogicaDeNegocios.ExamenesPreguntas().
                    //   RegistrarPreguntaExamen(codigoExamen, pregunta, DateTime.Now);

                    ServicioExamenesPreguntas.ExamenesPreguntasClient examenesPreguntas = new ServicioExamenesPreguntas.ExamenesPreguntasClient();
                    bool banderaPreguntaRegistrada = examenesPreguntas.RegistrarPreguntaExamen(codigoExamen, pregunta, DateTime.Now);


                    if (banderaPreguntaRegistrada)
                    {
                        MostrarPregunta(pregunta, codigoExamen);

                        var respuestas = new ServicioRespuestas.RespuestasClient()
                            .ObtenerRespuestasAleatorias(claveExamen, pregunta.HabilidadesId, pregunta.Id).ToList();

                        //var respuestas = new LogicaDeNegocios.Respuestas().
                        //    ObtenerRespuestasAleatorias(claveExamen, pregunta.HabilidadesId, pregunta.Id);

                        MostrarRespuestas(respuestas, pregunta.OpcionMultiple);
                        
                    }
                    else
                    {
                        Response.Redirect("Resultado.aspx?Mensaje=Error del sistema");
                    }

                }
                else
                {
                    Response.Redirect("Resultado.aspx");
                }
                
            }

        }

        #region Obtener Pregunta

        private PreguntaAleatoria ObtenerPregunta(string claveExamen, string codigoExamen)
        {            
            pregunta = preguntas.ObtenerPreguntaAleatoria(claveExamen, codigoExamen);

            Session["UltimaPregunta"] = pregunta;

            return pregunta;
        }
        
        #endregion

        #region Mostrar Respuestas
        private void MostrarRespuestas(List<RespuestaAleatoria> respuestas, bool opcionMultiple)
        {
            if (opcionMultiple)
            {
                blistRespuestas.Visible = false;

                ckListRespuestas.Items.Clear();

                foreach (var respuesta in respuestas)
                {
                    ckListRespuestas.Items.Add(new ListItem(respuesta.Enunciado, respuesta.Consecutivo.ToString()));
                }
            }
            else
            {
                ckListRespuestas.Visible = false;

                blistRespuestas.Items.Clear();
                int i = 0;

                foreach (var respuesta in respuestas)
                {
                    blistRespuestas.Items.Add(new ListItem(respuesta.Enunciado, respuesta.Consecutivo.ToString()));
                }
            }

        } 
        #endregion

        #region Obtener Respuestas Usuario

        private char[] ObtenerRespuestasUsuario(bool opcionMultiple)
        {
            string strRespuestas;

            if (opcionMultiple)
            {
                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < ckListRespuestas.Items.Count; i++)
                {
                    if (ckListRespuestas.Items[i].Selected)
                    {
                        sb.Append(ckListRespuestas.Items[i].Value);
                    }
                }

                strRespuestas = sb.ToString();
            }
            else
            {
                strRespuestas = blistRespuestas.SelectedValue;
            }

            return strRespuestas.ToCharArray();
        }
        
        #endregion

        protected void btnSiguiente_Click(object sender, EventArgs e)
        {
            codigoExamen = GetCookieString("CodigoExamen");
            claveExamen = GetCookieString("ClaveExamen");

            pregunta = (PreguntaAleatoria)Session["UltimaPregunta"];            

            var arrRespuestas = ObtenerRespuestasUsuario(pregunta.OpcionMultiple);

            var respuestas = new ServicioRespuestas.RespuestasClient();
            //var respuestas = new LogicaDeNegocios.Respuestas();

        
            bool respuestaEnRangoTiempo = respuestas.VerificaRespuestaEnRangoTiempo(codigoExamen, pregunta);

            bool respuestaEnviada = respuestas.RegistrarRespuesta(codigoExamen, pregunta, arrRespuestas, respuestaEnRangoTiempo);

            if (respuestaEnRangoTiempo)
            {
                if (respuestaEnviada)
                {
                    Response.Redirect("Pregunta.aspx");
                    
                }
                else
                {
                    Response.Redirect("Resultado.aspx?Mensaje=Error del sistema");
                }
            }
            else
            {
                if (respuestaEnviada)
                {
                    Response.Redirect("Resultado.aspx?Mensaje=Excedió el tiempo para responder la pregunta");
                }
                else
                {
                    Response.Redirect("Resultado.aspx?Mensaje=Error del sistema");
                }                
            }
        }

        #region MostrarPregunta

        private void MostrarPregunta(PreguntaAleatoria pregunta, string codigoExamen)
        {
            var examenesCodigos = new ServicioExamenesCodigos.ExamenesCodigosClient();
           // var examenesCodigos = new LogicaDeNegocios.ExamenesCodigos();
            var examenCodigo = examenesCodigos.ObtenerCodigoExamen(codigoExamen);

            lblIndicadorPreguntas.Text = string.Format("Pregunta {0} de {1}"
                , examenCodigo.CantidadPreguntasRespondidas
                , examenCodigo.CantidadPreguntasPorResponder + examenCodigo.CantidadPreguntasRespondidas);


            lblPregunta.Text = string.Format("ID:{0} Tiempo Estimado:{1}  OpcionMultiple:{2}  Consecutivo:{3} <br/> {4}",
                pregunta.Id, pregunta.TiempoEstimado, pregunta.OpcionMultiple, pregunta.ConsecutivosRespuestasCorrecta, pregunta.Enunciado);

        }

        #endregion



        #region Cookies

        private string GetCookieString(string keyName)
        {
            if (Request.Cookies[keyName] != null)
            {
                return Request.Cookies[keyName].Value;
            }

            return "Unknown";
        }

        private int GetCookieInt(string keyName)
        {
            if (Request.Cookies[keyName] != null)
            {
                return int.Parse(Request.Cookies[keyName].Value);
            }

            return 0;
        }

        private void SetCookie(string keyName, string value)
        {
            Response.Cookies[keyName].Value = value;
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx");
        }
        
        #endregion
    }
}